﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace GENERIC.MVVM.Model
{
    /// <summary>
    /// Classe de base du modèle
    /// </summary>
    public abstract class ModelBase : INotifyPropertyChanging, INotifyPropertyChanged
    {
        #region Constructor

        /// <summary>
        /// Initialise une nouvelle instance de la classe ModelBase
        /// </summary>
        public ModelBase()
        {
        }

        #endregion

        #region INotifyPropertyChanging Members

        /// <summary>
        /// L’événement PropertyChanging pour une propriété
        /// </summary>
        public event PropertyChangingEventHandler PropertyChanging;
        /// <summary>
        /// Déclenche l’événement PropertyChanging pour une propriété
        /// donnée.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="exp">L’expression permettant de retrouver la propriété.</param>
        protected void RaisePropertyChanging<T>(Expression<Func<T>> exp)
        {
            var memberExpression = exp.Body as MemberExpression;
            if (memberExpression != null)
            {
                string propertyName = memberExpression.Member.Name;
                var handler = PropertyChanging;
                if (handler != null)
                    handler(this, new PropertyChangingEventArgs(propertyName));
            }
        }
        #endregion // INotifyPropertyChanged Members

        #region INotifyPropertyChanged Members

        /// <summary>
        /// l’événement PropertyChanged pour une propriété
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;
        /// <summary>
        /// Déclenche l’événement PropertyChanged pour une propriété donnée.
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="exp">L’expression permettant de retrouver la
        /// propriété.</param>
        protected void RaisePropertyChanged<T>(Expression<Func<T>> exp)
        {
            var memberExpression = exp.Body as MemberExpression;
            if (memberExpression != null)
            {
                string propertyName = memberExpression.Member.Name;
                PropertyChangedEventHandler handler = PropertyChanged;
                if (handler != null)
                    handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        #endregion // INotifyPropertyChanged Members
    }
}
